#ifndef __FILTER_H__
#define __FILTER_H__

#include "stm32f1xx.h" 
 
/* --------------------------------------- 基础滤波算法 --------------------------------------- */
/* 限幅滤波算法 */
uint16_t limitFilter(const uint16_t curValue, const uint16_t preValue, const uint16_t maxLimit);

/* 中值滤波算法 */
uint16_t medianFilter(uint16_t pValueArray[], const uint8_t length);

/* 平均值滤波算法 */
uint16_t aveFilter(const uint16_t pValueArray[], const uint8_t length);

/* ------------------------------------- 滑动窗口滤波算法 ------------------------------------- */
/* 中位数值滤波算法（去极值平均滤波） */
uint16_t midAveFilter(uint16_t pValueArray[], const uint8_t length);

/* 滑动平均滤波算法 */
uint16_t movAVeFilter(uint16_t pValueArray[], const uint8_t length, const uint16_t newValue);

/* 限幅滑动平均 */
uint16_t limitMovAve(uint16_t pValueArray[], const uint8_t length, const uint16_t newValue, const uint16_t maxLimit);

/* 加权递推平均滤波法 */
uint16_t weightMovAve(const uint8_t weight[], uint16_t pValueArray[], const uint8_t length, const uint16_t newValue);

/* -------------------------------------- 高级滤波算法 -------------------------------------- */
/* 一阶低通滤波算法 */
uint16_t lowPass1st(const uint16_t curValue, const uint16_t preValue, const double k);

/* 消除抖动算法 */
uint16_t clearJitter(const uint16_t curValue, const uint16_t preValue, uint8_t *pCount, const uint8_t threshold);

/* 限幅消除抖动算法 */
uint16_t limitClearJitter(const uint16_t curValue, const uint16_t preValue, uint8_t *pCount, const uint16_t maxLimit, const uint8_t threshold);

/* 卡尔曼滤波算法（简化版） */
uint16_t kalmanFilter(const uint16_t curValue, float *pEstimate, float *pErrorEst, const float q, const float r);

/* 指数加权移动平均滤波（EWMA） */
uint16_t ewmaFilter(const uint16_t curValue, float *pLastAvg, const float alpha);

/* 双边滤波（去除突变噪声） */
uint16_t bilateralFilter(uint16_t pValueArray[], const uint8_t length, const uint16_t threshold);

/* 自适应滤波（根据变化率调整滤波强度） */
uint16_t adaptiveFilter(const uint16_t curValue, const uint16_t preValue, float *pFilterVal, const float minAlpha, const float maxAlpha);

/* ---------------------------------------- 工具函数 ---------------------------------------- */
/* 数组限幅滤波 */
void limitFilterArray(uint16_t *array1, uint16_t *array2, uint16_t maxLimit, uint8_t dataLength);

#endif  /*__FILTER_H__*/
